package com.raindrop.rd.parser.token;

import java.util.List;

/**
 * token流式处理类，接受源码转换后的token，方便生成AST树
 *
 * @author BillDowney
 * @date 2021/3/22 22:42
 */
public class TokenStream {

    /**
     * 由{@link Tokenizer}生成
     */
    private final List<Token> tokens;
    /**
     * tokens长度
     */
    private final int end;
    /**
     * 当前索引位置
     */
    private int index;
    /**
     * 标记索引位
     */
    private int makeIndex;

    public TokenStream(List<Token> tokens) {
        this.tokens = tokens;
        this.index = 0;
        this.end = tokens.size();
    }

    public boolean hasMore() {
        return index < end;
    }

    /**
     * 消费一个token并便宜下标
     *
     * @return 当前token
     */
    public Token consume() {
        if (!hasMore()) {
            throw new RuntimeException("没有下一个token");
        }
        return tokens.get(index++);
    }

    /**
     * 获取上一个token
     *
     * @return 上一个token
     */
    public Token getPrev() {
        if (index == 0) {
            throw new RuntimeException("没有上一个token");
        }
        return tokens.get(index - 1);
    }

    @Override
    public String toString() {
        return "TokenStream{" +
                "tokens=" + tokens +
                ", end=" + end +
                ", index=" + index +
                '}';
    }

    public int makeIndex() {
        this.makeIndex = index;
        return this.makeIndex;
    }
}
